function [ output ] = Memeticofunction( tabladatos,cartera  )
%% Parametros
Poblacionnicial = 0.5e5;
seleccionFinal=1000;

%% Ordeno Tabladatos
tabladatosVertical = length(tabladatos(:,1));
tabladatosHorizontal = length(tabladatos(1,:));
parfor columna=1:tabladatosHorizontal
   sistema(columna)=columna;
   ratioMCIM(columna) =RatioMCIM( tabladatos(:,columna) )  ;
end

tablaResultados(:,1)=sistema(:);
tablaResultados(:,2)=ratioMCIM(:);
entradauno=sortrows(tablaResultados,2);%0-226
entradauno=flipud(entradauno);
tablacombinaciones_ind=entradauno(:,1);%solo me interesa la prmera columna
clear tablaResultados
clear entradauno
%% Poblaciones iniciales
%cartera=4;


[ poblacion ] = InitialPopulationRandom(Poblacionnicial,tablacombinaciones_ind,cartera);
%Poda Poblacion
[ poblacionpodada ] = podapoblacion( poblacion,tabladatos ,tablacombinaciones_ind);
%% Opciones AlgoritmoMmetico
Poblacionnicialpodada = length(poblacionpodada(:,1));

FitnessFunction = @(sistema)multifitnessfuntion_combinando( sistema,tablacombinaciones_ind,tabladatos  ); % Function handle to the fitness function
nvars=cartera;

ub=ones(1,cartera).*tabladatosHorizontal;
lb=ones(1,cartera);
PopulationSize_Data=Poblacionnicialpodada+round(Poblacionnicialpodada*0.5);%el 50% aleatorio
EliteCount_Data=round(Poblacionnicialpodada*0.05);%Inidividuos que pasan a la siguiente generacion,los mejores
Generations_Data=400;%numero maximo de generaciones
StallGenLimit_Data=20;%numero maximo de generaciones sin mejorar
TolFun_Data=1e-5;%Tolerancia
InitialPopulation_Data=[double(poblacionpodada)];

const=1:cartera;
A = []; b = []; % No linear inequality constraints
Aeq = []; beq = []; % No linear equality constraints
options = gaoptimset;
options = gaoptimset('PlotFcns',@gaplotpareto);
options = gaoptimset(options,'PopulationSize', round(PopulationSize_Data/5));
options = gaoptimset(options,'EliteCount', EliteCount_Data);
options = gaoptimset(options,'Generations', Generations_Data);
options = gaoptimset(options,'StallGenLimit', StallGenLimit_Data);
options = gaoptimset(options,'TolFun', TolFun_Data);
options = gaoptimset(options,'InitialPopulation', InitialPopulation_Data);
options = gaoptimset(options,'Display', 'iter');
options = gaoptimset(options,'UseParallel', 'always');%para usar todos los nucleos
%% Arranca algorimo
[x,fval,exitFlag,output] = gamultiobj(FitnessFunction,nvars,A, ...
    b,Aeq,beq,lb,ub,options);
close all
fprintf('The number of points on the Pareto front was: %d\n', size(x,1));
fprintf('The number of generations was : %d\n', output.generations);
titulo =strcat('tempSalidaGAMulti_',num2str(cartera));
%save(strcat(titulo,'.mat'),'x','fval','exitFlag','output');

%% Pinta mejor individuo
x=round(x);
clear sistema
for parametro=1:cartera
    sistema(1,parametro)=tablacombinaciones_ind(x(1,parametro),1);%traduce
end

SistemasGanadores=sistema;

% Selecciona los mejores 1000 individuos
close all

parfor parametro=1:cartera
    population(:,parametro)=tablacombinaciones_ind(x(:,parametro),1);
end

TablaSistemasFinal = [SistemasGanadores;unique(population,'rows','stable')];
TablaSistemasFinal=unique(TablaSistemasFinal,'rows','stable');
filas=min(seleccionFinal,length(TablaSistemasFinal(:,1)));
TablaSistemasFinal=TablaSistemasFinal(1:filas,:);%Slecciona

titulo =strcat('MejoresCombinaciones_',num2str(cartera));
save(strcat(titulo,'.mat'),'x','fval','exitFlag','output','TablaSistemasFinal');

output = TablaSistemasFinal;
close all
clc
fprintf('Fin del Memetico con %i elemetos de cartera \n',cartera)
end